/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.osiris.persistence.controllers.impl;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import org.osiris.persistence.Impactocambio;
import org.osiris.persistence.Incertidumbre;
import org.osiris.persistence.Estadorequisito;
import org.osiris.persistence.Peticioncambio;
import org.osiris.persistence.Prioridadrequisito;
import org.osiris.persistence.Complejidadrequisito;
import org.osiris.persistence.Recurso;
import java.util.ArrayList;
import java.util.List;
import org.osiris.persistence.Modificaciondeec;
import org.osiris.persistence.controllers.PeticionCambioInterface;
import org.osiris.persistence.controllers.exceptions.IllegalOrphanException;
import org.osiris.persistence.controllers.exceptions.NonexistentEntityException;

/**
 *
 * @author amartinez
 */
public class PeticioncambioJpaController implements PeticionCambioInterface {

    public PeticioncambioJpaController() {
    	emf = CreadorPU.getEntityManagerFactory();
    }
    private EntityManagerFactory emf = null;

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#getEntityManager()
	 */
    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#create(org.osiris.persistence.Peticioncambio)
	 */
    public void create(Peticioncambio peticioncambio) {
        if (peticioncambio.getRecursoList() == null) {
            peticioncambio.setRecursoList(new ArrayList<Recurso>());
        }
        if (peticioncambio.getModificaciondeecList() == null) {
            peticioncambio.setModificaciondeecList(new ArrayList<Modificaciondeec>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Impactocambio impactocambio = peticioncambio.getImpactocambio();
            if (impactocambio != null) {
                impactocambio = em.getReference(impactocambio.getClass(), impactocambio.getIdPeticion());
                peticioncambio.setImpactocambio(impactocambio);
            }
            Incertidumbre incertidumbre = peticioncambio.getIncertidumbre();
            if (incertidumbre != null) {
                incertidumbre = em.getReference(incertidumbre.getClass(), incertidumbre.getIdIncertidumbre());
                peticioncambio.setIncertidumbre(incertidumbre);
            }
            Estadorequisito estado = peticioncambio.getEstado();
            if (estado != null) {
                estado = em.getReference(estado.getClass(), estado.getIdEstadoRequisito());
                peticioncambio.setEstado(estado);
            }
            Prioridadrequisito prioridad = peticioncambio.getPrioridad();
            if (prioridad != null) {
                prioridad = em.getReference(prioridad.getClass(), prioridad.getIdPrioridadRequisito());
                peticioncambio.setPrioridad(prioridad);
            }
            Complejidadrequisito complejidad = peticioncambio.getComplejidad();
            if (complejidad != null) {
                complejidad = em.getReference(complejidad.getClass(), complejidad.getIdComplejidadRequisito());
                peticioncambio.setComplejidad(complejidad);
            }
            List<Recurso> attachedRecursoList = new ArrayList<Recurso>();
            for (Recurso recursoListRecursoToAttach : peticioncambio.getRecursoList()) {
                recursoListRecursoToAttach = em.getReference(recursoListRecursoToAttach.getClass(), recursoListRecursoToAttach.getIdRecurso());
                attachedRecursoList.add(recursoListRecursoToAttach);
            }
            peticioncambio.setRecursoList(attachedRecursoList);
            List<Modificaciondeec> attachedModificaciondeecList = new ArrayList<Modificaciondeec>();
            for (Modificaciondeec modificaciondeecListModificaciondeecToAttach : peticioncambio.getModificaciondeecList()) {
                modificaciondeecListModificaciondeecToAttach = em.getReference(modificaciondeecListModificaciondeecToAttach.getClass(), modificaciondeecListModificaciondeecToAttach.getIdModificacionDeRequisito());
                attachedModificaciondeecList.add(modificaciondeecListModificaciondeecToAttach);
            }
            peticioncambio.setModificaciondeecList(attachedModificaciondeecList);
            em.persist(peticioncambio);
            if (impactocambio != null) {
                Peticioncambio oldPeticioncambioOfImpactocambio = impactocambio.getPeticioncambio();
                if (oldPeticioncambioOfImpactocambio != null) {
                    oldPeticioncambioOfImpactocambio.setImpactocambio(null);
                    oldPeticioncambioOfImpactocambio = em.merge(oldPeticioncambioOfImpactocambio);
                }
                impactocambio.setPeticioncambio(peticioncambio);
                impactocambio = em.merge(impactocambio);
            }
            if (incertidumbre != null) {
                incertidumbre.getPeticioncambioList().add(peticioncambio);
                incertidumbre = em.merge(incertidumbre);
            }
            if (estado != null) {
                estado.getPeticioncambioList().add(peticioncambio);
                estado = em.merge(estado);
            }
            if (prioridad != null) {
                prioridad.getPeticioncambioList().add(peticioncambio);
                prioridad = em.merge(prioridad);
            }
            if (complejidad != null) {
                complejidad.getPeticioncambioList().add(peticioncambio);
                complejidad = em.merge(complejidad);
            }
            for (Recurso recursoListRecurso : peticioncambio.getRecursoList()) {
                recursoListRecurso.getPeticioncambioList().add(peticioncambio);
                recursoListRecurso = em.merge(recursoListRecurso);
            }
            for (Modificaciondeec modificaciondeecListModificaciondeec : peticioncambio.getModificaciondeecList()) {
                Peticioncambio oldPeticioncambioOrigenOfModificaciondeecListModificaciondeec = modificaciondeecListModificaciondeec.getPeticioncambioOrigen();
                modificaciondeecListModificaciondeec.setPeticioncambioOrigen(peticioncambio);
                modificaciondeecListModificaciondeec = em.merge(modificaciondeecListModificaciondeec);
                if (oldPeticioncambioOrigenOfModificaciondeecListModificaciondeec != null) {
                    oldPeticioncambioOrigenOfModificaciondeecListModificaciondeec.getModificaciondeecList().remove(modificaciondeecListModificaciondeec);
                    oldPeticioncambioOrigenOfModificaciondeecListModificaciondeec = em.merge(oldPeticioncambioOrigenOfModificaciondeecListModificaciondeec);
                }
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#edit(org.osiris.persistence.Peticioncambio)
	 */
    public void edit(Peticioncambio peticioncambio) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Peticioncambio persistentPeticioncambio = em.find(Peticioncambio.class, peticioncambio.getIdPeticion());
            Impactocambio impactocambioOld = persistentPeticioncambio.getImpactocambio();
            Impactocambio impactocambioNew = peticioncambio.getImpactocambio();
            Incertidumbre incertidumbreOld = persistentPeticioncambio.getIncertidumbre();
            Incertidumbre incertidumbreNew = peticioncambio.getIncertidumbre();
            Estadorequisito estadoOld = persistentPeticioncambio.getEstado();
            Estadorequisito estadoNew = peticioncambio.getEstado();
            Prioridadrequisito prioridadOld = persistentPeticioncambio.getPrioridad();
            Prioridadrequisito prioridadNew = peticioncambio.getPrioridad();
            Complejidadrequisito complejidadOld = persistentPeticioncambio.getComplejidad();
            Complejidadrequisito complejidadNew = peticioncambio.getComplejidad();
            List<Recurso> recursoListOld = persistentPeticioncambio.getRecursoList();
            List<Recurso> recursoListNew = peticioncambio.getRecursoList();
            List<Modificaciondeec> modificaciondeecListOld = persistentPeticioncambio.getModificaciondeecList();
            List<Modificaciondeec> modificaciondeecListNew = peticioncambio.getModificaciondeecList();
            List<String> illegalOrphanMessages = null;
            if (impactocambioOld != null && !impactocambioOld.equals(impactocambioNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Impactocambio " + impactocambioOld + " since its peticioncambio field is not nullable.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (impactocambioNew != null) {
                impactocambioNew = em.getReference(impactocambioNew.getClass(), impactocambioNew.getIdPeticion());
                peticioncambio.setImpactocambio(impactocambioNew);
            }
            if (incertidumbreNew != null) {
                incertidumbreNew = em.getReference(incertidumbreNew.getClass(), incertidumbreNew.getIdIncertidumbre());
                peticioncambio.setIncertidumbre(incertidumbreNew);
            }
            if (estadoNew != null) {
                estadoNew = em.getReference(estadoNew.getClass(), estadoNew.getIdEstadoRequisito());
                peticioncambio.setEstado(estadoNew);
            }
            if (prioridadNew != null) {
                prioridadNew = em.getReference(prioridadNew.getClass(), prioridadNew.getIdPrioridadRequisito());
                peticioncambio.setPrioridad(prioridadNew);
            }
            if (complejidadNew != null) {
                complejidadNew = em.getReference(complejidadNew.getClass(), complejidadNew.getIdComplejidadRequisito());
                peticioncambio.setComplejidad(complejidadNew);
            }
            List<Recurso> attachedRecursoListNew = new ArrayList<Recurso>();
            for (Recurso recursoListNewRecursoToAttach : recursoListNew) {
                recursoListNewRecursoToAttach = em.getReference(recursoListNewRecursoToAttach.getClass(), recursoListNewRecursoToAttach.getIdRecurso());
                attachedRecursoListNew.add(recursoListNewRecursoToAttach);
            }
            recursoListNew = attachedRecursoListNew;
            peticioncambio.setRecursoList(recursoListNew);
            List<Modificaciondeec> attachedModificaciondeecListNew = new ArrayList<Modificaciondeec>();
            for (Modificaciondeec modificaciondeecListNewModificaciondeecToAttach : modificaciondeecListNew) {
                modificaciondeecListNewModificaciondeecToAttach = em.getReference(modificaciondeecListNewModificaciondeecToAttach.getClass(), modificaciondeecListNewModificaciondeecToAttach.getIdModificacionDeRequisito());
                attachedModificaciondeecListNew.add(modificaciondeecListNewModificaciondeecToAttach);
            }
            modificaciondeecListNew = attachedModificaciondeecListNew;
            peticioncambio.setModificaciondeecList(modificaciondeecListNew);
            peticioncambio = em.merge(peticioncambio);
            if (impactocambioNew != null && !impactocambioNew.equals(impactocambioOld)) {
                Peticioncambio oldPeticioncambioOfImpactocambio = impactocambioNew.getPeticioncambio();
                if (oldPeticioncambioOfImpactocambio != null) {
                    oldPeticioncambioOfImpactocambio.setImpactocambio(null);
                    oldPeticioncambioOfImpactocambio = em.merge(oldPeticioncambioOfImpactocambio);
                }
                impactocambioNew.setPeticioncambio(peticioncambio);
                impactocambioNew = em.merge(impactocambioNew);
            }
            if (incertidumbreOld != null && !incertidumbreOld.equals(incertidumbreNew)) {
                incertidumbreOld.getPeticioncambioList().remove(peticioncambio);
                incertidumbreOld = em.merge(incertidumbreOld);
            }
            if (incertidumbreNew != null && !incertidumbreNew.equals(incertidumbreOld)) {
                incertidumbreNew.getPeticioncambioList().add(peticioncambio);
                incertidumbreNew = em.merge(incertidumbreNew);
            }
            if (estadoOld != null && !estadoOld.equals(estadoNew)) {
                estadoOld.getPeticioncambioList().remove(peticioncambio);
                estadoOld = em.merge(estadoOld);
            }
            if (estadoNew != null && !estadoNew.equals(estadoOld)) {
                estadoNew.getPeticioncambioList().add(peticioncambio);
                estadoNew = em.merge(estadoNew);
            }
            if (prioridadOld != null && !prioridadOld.equals(prioridadNew)) {
                prioridadOld.getPeticioncambioList().remove(peticioncambio);
                prioridadOld = em.merge(prioridadOld);
            }
            if (prioridadNew != null && !prioridadNew.equals(prioridadOld)) {
                prioridadNew.getPeticioncambioList().add(peticioncambio);
                prioridadNew = em.merge(prioridadNew);
            }
            if (complejidadOld != null && !complejidadOld.equals(complejidadNew)) {
                complejidadOld.getPeticioncambioList().remove(peticioncambio);
                complejidadOld = em.merge(complejidadOld);
            }
            if (complejidadNew != null && !complejidadNew.equals(complejidadOld)) {
                complejidadNew.getPeticioncambioList().add(peticioncambio);
                complejidadNew = em.merge(complejidadNew);
            }
            for (Recurso recursoListOldRecurso : recursoListOld) {
                if (!recursoListNew.contains(recursoListOldRecurso)) {
                    recursoListOldRecurso.getPeticioncambioList().remove(peticioncambio);
                    recursoListOldRecurso = em.merge(recursoListOldRecurso);
                }
            }
            for (Recurso recursoListNewRecurso : recursoListNew) {
                if (!recursoListOld.contains(recursoListNewRecurso)) {
                    recursoListNewRecurso.getPeticioncambioList().add(peticioncambio);
                    recursoListNewRecurso = em.merge(recursoListNewRecurso);
                }
            }
            for (Modificaciondeec modificaciondeecListOldModificaciondeec : modificaciondeecListOld) {
                if (!modificaciondeecListNew.contains(modificaciondeecListOldModificaciondeec)) {
                    modificaciondeecListOldModificaciondeec.setPeticioncambioOrigen(null);
                    modificaciondeecListOldModificaciondeec = em.merge(modificaciondeecListOldModificaciondeec);
                }
            }
            for (Modificaciondeec modificaciondeecListNewModificaciondeec : modificaciondeecListNew) {
                if (!modificaciondeecListOld.contains(modificaciondeecListNewModificaciondeec)) {
                    Peticioncambio oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec = modificaciondeecListNewModificaciondeec.getPeticioncambioOrigen();
                    modificaciondeecListNewModificaciondeec.setPeticioncambioOrigen(peticioncambio);
                    modificaciondeecListNewModificaciondeec = em.merge(modificaciondeecListNewModificaciondeec);
                    if (oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec != null && !oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec.equals(peticioncambio)) {
                        oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec.getModificaciondeecList().remove(modificaciondeecListNewModificaciondeec);
                        oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec = em.merge(oldPeticioncambioOrigenOfModificaciondeecListNewModificaciondeec);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Long id = peticioncambio.getIdPeticion();
                if (findPeticioncambio(id) == null) {
                    throw new NonexistentEntityException("The peticioncambio with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#destroy(java.lang.Long)
	 */
    public void destroy(Long id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Peticioncambio peticioncambio;
            try {
                peticioncambio = em.getReference(Peticioncambio.class, id);
                peticioncambio.getIdPeticion();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The peticioncambio with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Impactocambio impactocambioOrphanCheck = peticioncambio.getImpactocambio();
            if (impactocambioOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Peticioncambio (" + peticioncambio + ") cannot be destroyed since the Impactocambio " + impactocambioOrphanCheck + " in its impactocambio field has a non-nullable peticioncambio field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Incertidumbre incertidumbre = peticioncambio.getIncertidumbre();
            if (incertidumbre != null) {
                incertidumbre.getPeticioncambioList().remove(peticioncambio);
                incertidumbre = em.merge(incertidumbre);
            }
            Estadorequisito estado = peticioncambio.getEstado();
            if (estado != null) {
                estado.getPeticioncambioList().remove(peticioncambio);
                estado = em.merge(estado);
            }
            Prioridadrequisito prioridad = peticioncambio.getPrioridad();
            if (prioridad != null) {
                prioridad.getPeticioncambioList().remove(peticioncambio);
                prioridad = em.merge(prioridad);
            }
            Complejidadrequisito complejidad = peticioncambio.getComplejidad();
            if (complejidad != null) {
                complejidad.getPeticioncambioList().remove(peticioncambio);
                complejidad = em.merge(complejidad);
            }
            List<Recurso> recursoList = peticioncambio.getRecursoList();
            for (Recurso recursoListRecurso : recursoList) {
                recursoListRecurso.getPeticioncambioList().remove(peticioncambio);
                recursoListRecurso = em.merge(recursoListRecurso);
            }
            List<Modificaciondeec> modificaciondeecList = peticioncambio.getModificaciondeecList();
            for (Modificaciondeec modificaciondeecListModificaciondeec : modificaciondeecList) {
                modificaciondeecListModificaciondeec.setPeticioncambioOrigen(null);
                modificaciondeecListModificaciondeec = em.merge(modificaciondeecListModificaciondeec);
            }
            em.remove(peticioncambio);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#findPeticioncambioEntities()
	 */
    public List<Peticioncambio> findPeticioncambioEntities() {
        return findPeticioncambioEntities(true, -1, -1);
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#findPeticioncambioEntities(int, int)
	 */
    public List<Peticioncambio> findPeticioncambioEntities(int maxResults, int firstResult) {
        return findPeticioncambioEntities(false, maxResults, firstResult);
    }

    private List<Peticioncambio> findPeticioncambioEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            Query q = em.createQuery("select object(o) from Peticioncambio as o");
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#findPeticioncambio(java.lang.Long)
	 */
    public Peticioncambio findPeticioncambio(Long id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Peticioncambio.class, id);
        } finally {
            em.close();
        }
    }

    /* (non-Javadoc)
	 * @see org.osiris.persistence.controllers.PeticionCambioInterface#getPeticioncambioCount()
	 */
    public int getPeticioncambioCount() {
        EntityManager em = getEntityManager();
        try {
            return ((Long) em.createQuery("select count(o) from Peticioncambio as o").getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
